/*
 * tableHashage.c
 *
 *  Created on: 3 déc. 2011
 *      Author: arthur
 */

#include "tableHashage.h"

unsigned int hashage(char * mot) {
	unsigned int i, result = 0;
	for (i = 0; mot[i] != '\0'; i++) {
		unsigned char lettre = 0;
		if (mot[i] >= '0' && mot[i] <= '9') {
			lettre = mot[i] - '0';
			result = result << B;
			result += lettre;
		} else if (mot[i] >= 'a' && mot[i] <= 'z') {
			lettre = 10 + mot[i] - 'a';
			result = result << B;
			result += lettre;
		} else if (mot[i] >= 'A' && mot[i] <= 'Z') {
			lettre = 36 + mot[i] - 'A';
			result = result << B;
			result += lettre;
		} else if (mot[i] == '_') {
			lettre = 62;
			result = result << B;
			result += lettre;
		} else if (mot[i] == '\'') {
			lettre = 63;
			result = result << B;
			result += lettre;
		}

	}
	return result % N;
}

pileIdentifiants * nouvelIdentifiant(listeId ** tableHash, char * label) {
	pileIdentifiants * nouvellePile = creerPileId();
	listeId *nouvelleListe = malloc(sizeof(listeId));
	nouvelleListe->label = malloc(strlen(label) + 1);
	strcpy(nouvelleListe->label, label);
	nouvelleListe->pileId = nouvellePile;
	nouvelleListe->next = tableHash[hashage(label)];
	tableHash[hashage(label)] = nouvelleListe;
	return nouvellePile;
}

pileIdentifiants * retrouverIdentifiant(listeId ** tableHash, char * label) {
	listeId * lId = tableHash[hashage(label)];
	pileIdentifiants * pId = NULL;

	while (lId != NULL && pId == NULL) {
		if (strcmp(label, lId->label) == 0) {
			pId = lId->pileId;
		} else {
			lId = lId->next;
		}
	}
	return pId;
}

void supprimerNiveauTable(listeId ** tableHash, int lvl) {
	int i;
	for (i = 0; i < N; i++) {
		listeId * listeIdCourante = tableHash[i];
		while (listeIdCourante != NULL) {
			supprimerNiveau(listeIdCourante->pileId, lvl);
			listeIdCourante = listeIdCourante->next;
		}
	}
}

void afficherTable(listeId ** tableHash) {
	printf("\n\n************ Table des symboles ************\n");
	int i;
	for (i = 0; i < N; i++) {
		listeId * listeIdCourante = tableHash[i];
		while (listeIdCourante != NULL) {
			printf("%s :\n", listeIdCourante->label);
			afficherPile(listeIdCourante->pileId);
			listeIdCourante = listeIdCourante->next;
		}
	}
	printf("\n\n");
}
